// 解决循环引用的深拷贝方法： 运用了map 数据对象具有唯一性，而且map 的key可以是一个索引
function clone(target, map = new WeakMap()) {
    if (typeof target === 'object') {
        let cloneTarget = Array.isArray(target) ? [] : {};
        if (map.get(target)) { //// 检测map[]中有无克隆过的对象

            return target;  // 在这里结束递归，是clone递归的终点
        }
        map.set(target, cloneTarget); // 没有将map 设为key
        for (const key in target) { // 老方法进行遍历
            cloneTarget[key] = clone(target[key], map); // 将map传进去进行检测是否以前存在过
        }
        return cloneTarget;
    } else {
        return target;
    }
};

// ---------------------------------- 测试

const target = {
    field1: 1,
    field2: undefined,
    field3: {
        child: 'child'
    },
    field4: [2, 4, 8]
};

target.target = target;

const result = clone(target);

console.log(result);